package com.yeban.javase.day20.test.test1;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.util.stream.Stream;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/11/4
 *
 * 需求：获取对象的所有属性及其值，以 name-张三 ，num-101 ， age=18存入obj.txt文件中
 * 格式如下：
 * ----------Teacher+-----------
 * name - 王朝
 * workAge - 10
 * major - 舞蹈
 * ----------Student+-----------
 * name - 张三
 * num - 101
 * age - 18
 */
public class fieldTest1 {

    public static void main(String[] args) {
        Student01 stu = new Student01("张三", 101, 18);
        Teacher01 tea = new Teacher01("李四", 10, "语文");

        print(stu);
        print(tea);
        /*// 1.创建的类类型
        Class<Student01> clazz1 = Student01.class;
        Class<Teacher01> clazz2 = Teacher01.class;

        // 2.获取所有成员变量对应的Field对象
        Field[] stuFields = clazz1.getDeclaredFields();
        Field[] teaFields = clazz2.getDeclaredFields();

        // 创建写出流
        try(PrintWriter pw = new PrintWriter("src/com/yeban/javase/day20/reflect/field/test1/obj.txt");) {

            pw.write("---------- Teacher ----------\n");
            for (Field t : teaFields) {
                // 1.取消访问权限检查
                t.setAccessible(true);
                // 2.获取tea对象的属性和值
                String fieldName = t.getName();
                Object fieldValue = t.get(tea);
                // 3.拼接并写入文件中
                pw.println(fieldName + " - " + fieldValue);
            }

            pw.write("\n---------- Student ----------\n");
            for (Field f : stuFields) {
                // 1.取消访问权限检查（包括private）
                f.setAccessible(true);
                // 2.获取对象属性和值
                String fieldName = f.getName();
                Object fieldValue = f.get(stu);
                // 3.拼装信息写入文件
                pw.println(fieldName + " - " + fieldValue);
            }
        } catch (FileNotFoundException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }*/
        System.out.println("成功获取对象的属性和值！！！");
    }

    public static void print(Object obj) {
        try(PrintStream ps = new PrintStream(new FileOutputStream("src/com/yeban/javase/day20/reflect/field/test1/obj.txt",true))) {
            // 改变打印输出的方向
            System.setOut(ps);

            // 1.获取类类型
            Class<?> clazz = obj.getClass();
            System.out.println("---------- " + clazz.getSimpleName() + " ----------");

            // 2.忽略访问权限，获取所有属性
            Field[] fields = clazz.getDeclaredFields();
            Stream.of(fields).forEach(field -> {
                // 3.取消访问权限检查
                field.setAccessible(true);

                // 4.将属性信息写出至文件中    格式：属性名 - 属性值
                try {
                    System.out.println(field.getName() + " - " + field.get(obj));
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            });
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}
